/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package braipetro.client.regras;

import java.util.List;
import java.lang.reflect.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author manasses
 */
public class MetodoSistema {
    
    private String pacote;
    private String classe;
    private String nome;
    private String tipoRetorno;
    private List<Class> params = new ArrayList<Class>();
    
    public MetodoSistema(){}

    public MetodoSistema(String pPacote, String pClasse, String pNome) {
        this.pacote = pPacote;
        this.classe = pClasse;
        this.nome = pNome;
        this.tipoRetorno = "";
    }
    
    public MetodoSistema(String pPacote, String pClasse, String pNome, String pTipoRetorno) {
        this.pacote = pPacote;
        this.classe = pClasse;
        this.nome = pNome;
        this.tipoRetorno = pTipoRetorno;
    }

    public String getTipoRetorno() {
        return tipoRetorno;
    }

    public void setTipoRetorno(String tipoRetorno) {
        this.tipoRetorno = tipoRetorno;
    }

    public String getPacote() {
        return pacote;
    }

    public void setPacote(String pacote) {
        this.pacote = pacote;
    }

    public String getClasse() {
        return classe;
    }

    public void setClasse(String classe) {
        this.classe = classe;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
    
    public void addParam(Class cls){
        params.add(cls);
    }
    
    public Object execute(Object... valores) {
        
        Object obj = null;
        
        try {
            
            Class c = Class.forName(pacote + "." + classe);
          
            Class[] prm = new Class[params.size()];
            
            for (int i = 0; i < params.size(); i++)
            {
                prm[i] = params.get(i);
            }
            
            Method mtd = c.getMethod(nome, prm);
           
            obj = mtd.invoke(null, valores);
            
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(MetodoSistema.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchMethodException ex) {
            Logger.getLogger(MetodoSistema.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(MetodoSistema.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(MetodoSistema.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalArgumentException ex) {
            Logger.getLogger(MetodoSistema.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(MetodoSistema.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return obj;
    }
    
    
}
